//给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。 
//
// 示例 1: 
//
// 输入: 123
//输出: 321
// 
//
// 示例 2: 
//
// 输入: -123
//输出: -321
// 
//
// 示例 3: 
//
// 输入: 120
//输出: 21
// 
//
// 注意: 
//
// 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−231, 231 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。 
// Related Topics 数学 
// 👍 2169 👎 0

package leetcode.editor.cn;

import common.util.MyUtil;

/**
 * Java：整数反转
 *
 * @author changgui
 */
@SuppressWarnings("all")
public class P7_ReverseInteger {
    public static void main(String[] args) {
        Solution solution = new P7_ReverseInteger().new Solution();
        MyUtil.print(solution.reverse(-2147483648));

        boolean flag = ((-2147483648 >> 31) & 1) == 1;
        System.out.println(flag);
    }

    //leetcode submit region begin(Prohibit modification and deletion)

    /**
     * 注意边界，统一转成负数处理会简单很多
     * T: O(logN)
     * S: O(1)
     */
    class Solution {
        public int reverse(int x) {
            if (x == 0) {
                return 0;
            }
            // 是否负数
            boolean flag = ((x >> 31) & 1) == 1;
            // 统一转成负数处理
            x = flag ? x : -x;
            int minB = Integer.MIN_VALUE / 10; // 最小边界
            int minR = Integer.MIN_VALUE % 10;
            int res = 0;
            while (x != 0) {
                // 取个位数
                int i = x % 10;
                // 加上个位数之前需要判断是否越界了
                if (res < minB || (res == minB && i < minR)) {
                    return 0;
                }
                // 左移一位并加上个位数
                res = res * 10 + i;
                // 右移一位
                x = x / 10;
            }
            return flag ? res : -res;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}